export default{
	//为当前模块开启命令空间
	namespaced:true,
				
	  // 模块的 state 数据 只能被 mutations 中的方法来改变。
	state:()=>({
		 // 购物车的数组，用来存储购物车中每个商品的信息对象
		    // 每个商品的信息对象，都包含如下 6 个属性：
		    // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
				//将购物车中的数据持久化存储到本地  3.初始化的cart，取本地数据，如果没有给空数组[]，如果有值，转换成json

		cart:JSON.parse(uni.getStorageSync('cart')||'[]')
	}),
	mutations:{
		addToCart(state,goods)
		{
			// 根据提交的商品的Id，查询购物车中是否存在这件商品
			// 如果不存在，则 findResult 为 undefined；否则，为查找到的商品信息对象
			const findResult = state.cart.find((x)=>x.goods_id ==goods.goods_id)
			if(!findResult)
			{
				state.cart.push(goods)
			}
			else{
				findResult.goods_count ++
			}
			//将购物车中的数据持久化存储到本地 2.只要cart内容发生变化
			//通过 commit 方法，调用 m_cart 命名空间下的 saveToStorage 方法
			this.commit('m_cart/saveToStorage')
		},
		// 将购物车中的数据持久化存储到本地 1.增加方法，转成字符串
		saveToStorage(state)
		{
			uni.setStorageSync('cart',JSON.stringify(state.cart))
		},
		
		//更新购物车中的商品勾选状态 接收两个参数，第一个是state 不用传，第二个是外界传过来的参数
		updateGoodsState(state,goods)
		{
			// 根据 goods_id 查询购物车中对应商品的信息对象
		 const findResult =	state.cart.find(x=>x.goods_id===goods.goods_id)
		   // 有对应的商品信息对象
		 if(findResult)
		 {
			  // 更新对应商品的勾选状态
			 findResult.goods_state =goods.goods_state
			     // 持久化存储到本地
			 		 this.commit('m_cart/saveToStorage')					 
		 }
		},
		//更新商品的数量
		updateGoodsCount(state,goods)
		{
		 const findResult =	state.cart.find(x => x.goods_id === goods.goods_id)
		 if(findResult)
		 {
			 findResult.goods_count = goods.goods_count
			 this.commit('m_cart/saveToStorage')			
		 }
		}	,
			//根据Id删除对应的商品
		removeGoodsById(state,goods_id)
		{
			//只保留id非当前删除的商品信息
			state.cart = state.cart.filter(x=>x.goods_id!=goods_id)
				 this.commit('m_cart/saveToStorage')		
		},
		//更新所有商品的勾选状态
		updateAllGoodsState(state,newState)
		{
			state.cart.forEach(x=>x.goods_state=newState)
			this.commit('m_cart/saveToStorage')		
		},
	
	},
	// 模块的 getters 属性
	getters:{
		// 统计购物车中商品的总数量
		total(state){
			// let c =0
			 // 循环统计商品的数量，累加到变量 c 中
			// state.cart.forEach(x=>c += x.goods_count)
			// return c
			
		 return	state.cart.reduce((total,item)=>{return total+=item.goods_count},0)
			
		},
		//购物车中已勾选的商品总数量
		checkedCount(state){
			 // 先使用 filter 方法，从购物车中过滤器已勾选的商品
			  // 再使用 reduce 方法，将已勾选的商品总数量进行累加 reduce(()=>{},0) ，句法中的0，只有第一次循环生效
			  // reduce() 的返回值就是已勾选的商品的总数量
				
			//原始写法，因为我们{}中只有一行代码，所以可以简化去掉{} 和return 
			// state.cart.filter(x=x.goods_state).reduce((total,item)=>{return total+=item.goods_count},0)
			// 简化后
			return state.cart.filter(x=>x.goods_state).reduce((total,item)=> total += item.goods_count,0)
		},	
		//已勾选商品的总价
		checkedGoodsAmount(state){
			 // 先使用 filter 方法，从购物车中过滤器已勾选的商品
			  // 再使用 reduce 方法，将已勾选的商品数量 * 单价之后，进行累加
			  // reduce() 的返回值就是已勾选的商品的总价
			  // 最后调用 toFixed(2) 方法，保留两位小数
			return state.cart.filter(x => x.goods_state).reduce((total,item) => total+=item.goods_count*item.goods_price,0).toFixed(2)
		},
	}
	// mutationEvent
}
